#encoding:utf-8
"""
@name : 2021-07-14-python文件读写
@author : wenyao
@projectname: xsfh
"""
#字符编码
#翻译机   人 -- 机器

#ascii码  -- 英文字符映射表
#A -- 65

#unicode  万国码  所有的文字都给了一个编号
#unicode 编码的具体实现方式  utf-8, utf-16, utf-32
#utf-8 可变长的编码方式
#一个英文占用一个字节
#一个中文字符占用三个字节

#gbk gb2312
#一个中文2个字节

#python2默认编码ascii
  #第一行添加一个特殊注释
  #encoding:utf-8
#python3默认编码是utf-8

############以什么方式加码，就以什么方式解码
#bytes  -- str ： decode("utf8")
#str -- bytes:   encode("utf8")

#python中文件操作：
#文件打开 -- open 函数
# open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
#     Open file and return a stream.  Raise IOError upon failure.
#file： 要打开的文件路径
#mode： 打开的方式（只读，只写， 读写）
#encoding： 指定文件的编码方式
#buffering： 指定缓存方式

###########文件编码#################
# >>> fp = open("utf.txt")  #不指定编码就使用系统默认编码打开
# >>> fp.read()
# '这是utf8\n'
# >>> fp = open("gbk.txt")
# >>> fp.read()
# Traceback (most recent call last):
#   File "<stdin>", line 1, in <module>
#   File "/usr/lib64/python3.6/codecs.py", line 321, in decode
#     (result, consumed) = self._buffer_decode(data, self.errors, final)
# UnicodeDecodeError: 'utf-8' codec can't decode byte 0xd5 in position 0: invalid continuation byte
# >>> fp = open("gbk.txt", enconding="gbk")
# Traceback (most recent call last):
#   File "<stdin>", line 1, in <module>
# TypeError: 'enconding' is an invalid keyword argument for this function
# >>> fp = open("gbk.txt", encoding="gbk")   #指定使用gbk方式打开
# >>> fp.read()
# '这是gbk'

##########检测文件编码##########
#以二进制方式打开
# >>> import chardet
# >>> fp = open("utf.txt")
# >>> fp = open("utf.txt","rb")
# >>> chardet.detect(fp.read())
# {'encoding': 'utf-8', 'confidence': 0.7525, 'language': ''}
# >>> fp2 = open("gbk.txt","rb")
# >>> chardet.detect(fp2.read())
# {'encoding': 'ISO-8859-5', 'confidence': 0.4388398420352105, 'language': 'Russian'}

#########文件打开方式
#默认是只读模式
# >>> fp = open("utf.txt","x")
# Traceback (most recent call last):
#   File "<stdin>", line 1, in <module>
# FileExistsError: [Errno 17] File exists: 'utf.txt'
# >>> fp = open("utf.txt","w")
# >>> fp.read()
# Traceback (most recent call last):
#   File "<stdin>", line 1, in <module>
# io.UnsupportedOperation: not readable
# >>> fp = open("utf.txt","w+")
# >>> fp.read()
# ''
# >>> fp = open("utf.txt")
# >>> fp.write("aaaaa")
# Traceback (most recent call last):
#   File "<stdin>", line 1, in <module>
# io.UnsupportedOperation: not writable


#######写缓存
#什么时候写入磁盘？
#1、缓冲区满
#2、强制刷新  fp.flush()
#3、文件连接关闭  fp.close()
#4、程序退出时
# >>> fp = open("utf.txt","w")
# >>> fp.write("aaaa\n")
# 5
# >>> fp.flush()
# >>> fp.write("bbbb\n")
# 5
# >>> fp.close()
# >>> fp.write("ccccc\n")
# Traceback (most recent call last):
#   File "<stdin>", line 1, in <module>
# ValueError: I/O operation on closed file.

fp = open("utf.txt")
with 语法糖管理打开文件对象
自动帮你关闭文件连接
>>> with open("utf.txt") as fp:
...     fp.read(1)
...
'a'
>>> fp.read(1)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: I/O operation on closed file.
>>> \

文件的读取
fp.tell()  文件光标位置 整数 int
fp.seek(cookie， whence=0)  移动光标位置
  cookie --》偏移量  字节数
  whence --》指定相对位置   1，2只能在二进制模式下使用
         --》0 --相对位置在开始
         --》1 --相对于当前位置
         --》2 --相对于结束位置

read() -- 默认从当前位置读到末尾、
readline() -- 从当前位置读取到行末、
readlines() --返回列表

# >>> fp.seek(0)
# 0
# >>> fp.read()
# '你好世界\nbbbbb\nccccc\nddddd\neeeee\n'
# >>> fp.seek(0)
# 0
# >>> fp.readline()
# '你好世界\n'
# >>> fp.readline()
# 'bbbbb\n'
# >>> fp.readline()
# 'ccccc\n'
# >>> fp.readline()
# 'ddddd\n'
# >>> fp.seek(0)
# 0
# >>> fp.readlines()
# ['你好世界\n', 'bbbbb\n', 'ccccc\n', 'ddddd\n', 'eeeee\n']
# >>> fp.seek(0)
# 0
# >>> fp.readlines(20)
# ['你好世界\n', 'bbbbb\n', 'ccccc\n', 'ddddd\n']
# >>> fp.seek(0)
# 0
# >>> fp.readlines(18)
# ['你好世界\n', 'bbbbb\n', 'ccccc\n', 'ddddd\n']


小练习
显示除了以#号开头的所有的行
>>> fp = open("utf.txt")
>>> for line in fp:
...    if line[0] != "#":
...         print(line,end="")
...
你好世界
ccccc
ddddd
eeeee

#line.startswith("#")

#缓存设置
# buffer设置（默认：io.DEFAULT_BUFFER_SIZE )
# • 0 => 实时写入 （binary mode）
# • 1 => 行缓存 （ text mode） => \n
# • 其他数字n => 缓冲区大小n : 2*4096
# >>> fp = open("utf.txt","w+", buffering=1)
# >>> fp.write("aaa")
# 3
# >>> fp.write("aaa\n")
# 4
# >>> fp = open("utf.txt","wb+", buffering=0)
# >>> fp.write(b"aaa")
# 3
# >>> fp.write(b"\nbbbb")
# 5>>> fp = open("utf.txt","wb+", buffering=2)>>> fp = open("utf.txt","w+", buffering=2)>>> fp.write("a"*4096)4096>>> fp.write("a"*4095)4095>>> fp.write("a")1>>> fp.write("a")1

